<?php

// 雪里开简易预约制访客管理系统 V1.0（2025.05.20）
// 演示地址: http://fangke.chalide.cn
// 更新关注: /weivote/yuyuefangke
// 文件路径: sys/inxs.php
// 文件大小: 9571 字节
// 最后修改时间: 2025-05-20 22:20:03
// 作者: yujianyue
// 邮件: 15058593138@qq.com
// 版权所有,保留发行权和署名权
/**
 * 导入学生信息
 * 功能反馈:15058593138@qq.com
 */

// 处理AJAX请求
if (isset($_GET['act'])) {
    switch ($_GET['act']) {
        case 'import':
            // 检查是否有文件上传
            if (!isset($_FILES['file']) || $_FILES['file']['error'] != 0) {
                json_error('请选择要上传的文件');
            }
            
            // 检查文件类型
            $file_ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
            if ($file_ext != 'txt') {
                json_error('只支持TXT格式的文件导入');
            }
            
            // 检查文件大小
            global $upload_max_size;
            if ($_FILES['file']['size'] > $upload_max_size) {
                json_error('文件大小超过限制');
            }
            
            // 上传文件
            $upload_dir = '../uploads/';
            if (!is_dir($upload_dir)) {
                mkdir($upload_dir, 0755, true);
            }
            
            $temp_file = $_FILES['file']['tmp_name'];
            $target_file = $upload_dir . 'import_' . date('YmdHis') . '.txt';
            
            if (!move_uploaded_file($temp_file, $target_file)) {
                json_error('文件上传失败');
            }
            
            // 导入数据
            $skip_first = isset($_POST['skip_first']) ? $_POST['skip_first'] : 0;
            $db = new MySQLDB();
            
            // 读取文件
            $success = 0;
            $fail = 0;
            $line = 0;
            
            $handle = fopen($target_file, 'r');
            if (!$handle) {
                json_error('无法读取上传的文件');
            }
            
            while (($data = fgetcsv($handle, 1000, "\t")) !== false) {
                $line++;
                
                // 跳过第一行（可能是标题）
                if ($line === 1 && $skip_first == 1) {
                    continue;
                }
                
                // 检查数据格式
                if (count($data) < 3) {
                    $fail++;
                    continue;
                }
                
                // 提取数据
                $xh = trim($data[0]);
                $pwd = trim($data[1]);
                $name = trim($data[2]);
                $tel = isset($data[3]) ? trim($data[3]) : '';
                $type = isset($data[4]) ? trim($data[4]) : 'stu';
                
                // 验证必填字段
                if (!$xh || !$name) {
                    $fail++;
                    continue;
                }
                
                // 检查学号是否存在
                $exists = $db->getOne("SELECT * FROM `stux` WHERE `xh` = '" . $db->escape($xh) . "'");
                if ($exists) {
                    // 更新已有记录
                    $update_data = [
                        'name' => $name,
                        'tel' => $tel,
                        'type' => in_array($type, ['stu', 'sus', 'sys']) ? $type : 'stu'
                    ];
                    
                    // 如果密码不为空，则更新密码
                    if ($pwd) {
                        $update_data['pwd'] = $pwd;
                    }
                    
                    if ($db->update('stux', $update_data, "xh = '" . $db->escape($xh) . "'")) {
                        $success++;
                    } else {
                        $fail++;
                    }
                } else {
                    // 添加新记录
                    $insert_data = [
                        'xh' => $xh,
                        'pwd' => $pwd ?: $xh, // 密码为空则与学号相同
                        'name' => $name,
                        'tel' => $tel,
                        'type' => in_array($type, ['stu', 'sus', 'sys']) ? $type : 'stu',
                        'status' => 1
                    ];
                    
                    if ($db->insert('stux', $insert_data)) {
                        $success++;
                    } else {
                        $fail++;
                    }
                }
            }
            
            fclose($handle);
            
            // 删除临时文件
            @unlink($target_file);
            
            json_success('导入完成', [
                'success' => $success,
                'fail' => $fail,
                'total' => $success + $fail
            ]);
            break;
    }
    exit;
}

// 加载页头
require_once './inc/head.php';
?>

<div class="container">
    <div style="max-width: 600px; margin: 0 auto;">
        <h2 style="margin-bottom: 20px;">导入学生信息</h2>
        
        <div class="card" style="background-color: #f5f5f5; padding: 15px; margin-bottom: 20px; border-radius: 4px;">
            <h3 style="font-size: 16px; margin-bottom: 10px;">导入说明</h3>
            <p>1. 请使用Excel编辑数据，然后复制数据到文本文件，保存为TXT格式。</p>
            <p>2. 数据格式为制表符分隔，每行一条记录。</p>
            <p>3. 请按照以下顺序排列字段：学号、密码、姓名、电话、类型。</p>
            <p>4. 学号和姓名为必填项，密码为空则与学号相同。</p>
            <p>5. 类型可选值：stu(学生)、sus(门卡)、sys(系统)，默认为stu。</p>
            <p>6. 导入文件大小不超过2MB。</p>
        </div>
        
        <form id="import-form" enctype="multipart/form-data">
            <div class="form-group">
                <label class="form-label">选择文件</label>
                <input type="file" name="file" class="form-control" accept=".txt" required data-name="导入文件">
            </div>
            
            <div class="form-group">
                <label class="form-checkbox">
                    <input type="checkbox" name="skip_first" value="1" checked>
                    <span>跳过第一行（标题行）</span>
                </label>
            </div>
            
            <div class="form-group">
                <button type="button" id="import-btn" class="btn btn-primary">开始导入</button>
            </div>
        </form>
        
        <div id="import-result" style="display: none; margin-top: 20px;"></div>
        
        <div class="card" style="background-color: #f5f5f5; padding: 15px; margin-top: 20px; border-radius: 4px;">
            <h3 style="font-size: 16px; margin-bottom: 10px;">示例数据</h3>
            <pre style="background-color: #fff; padding: 10px; border-radius: 4px; overflow-x: auto;">学号	密码	姓名	电话	类型
S001	S001	张三	13812345678	stu
S002	S002	李四	13812345679	stu
M001	M001	门卡管理员1	13912345678	sus
admin	123456	系统管理员		sys</pre>
        </div>
    </div>
</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    // 导入按钮点击事件
    document.getElementById('import-btn').addEventListener('click', function() {
        if (!validateForm('import-form')) return;
        
        const form = document.getElementById('import-form');
        const formData = new FormData(form);
        
        // 显示加载状态
        document.getElementById('import-btn').disabled = true;
        document.getElementById('import-btn').innerHTML = '导入中...';
        
        // 发送AJAX请求
        const xhr = new XMLHttpRequest();
        xhr.open('POST', '?do=inxs&act=import', true);
        xhr.onreadystatechange = function() {
            if (xhr.readyState === 4) {
                // 恢复按钮状态
                document.getElementById('import-btn').disabled = false;
                document.getElementById('import-btn').innerHTML = '开始导入';
                
                if (xhr.status === 200) {
                    let result;
                    try {
                        result = JSON.parse(xhr.responseText);
                    } catch (e) {
                        showToast('服务器响应解析失败', 'error');
                        return;
                    }
                    
                    if (result.code === 0) {
                        showToast(result.msg, 'success');
                        
                        // 显示导入结果
                        const resultDiv = document.getElementById('import-result');
                        resultDiv.style.display = 'block';
                        resultDiv.innerHTML = `
                            <div class="card" style="background-color: #f0f8ff; padding: 15px; border-radius: 4px;">
                                <h3 style="font-size: 16px; margin-bottom: 10px;">导入结果</h3>
                                <p>共导入 ${result.data.total} 条记录</p>
                                <p>成功导入 <span style="color: green;">${result.data.success}</span> 条记录</p>
                                <p>失败导入 <span style="color: red;">${result.data.fail}</span> 条记录</p>
                            </div>
                        `;
                        
                        // 清空文件输入框
                        form.reset();
                    } else {
                        showToast(result.msg, 'error');
                    }
                } else {
                    showToast('网络请求失败', 'error');
                }
            }
        };
        xhr.send(formData);
    });
});
</script>
